#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct Nodo{
    int dato;
    struct Nodo *siguiente;
    struct Nodo *anterior;
}Nodo;

typedef struct {
    Nodo *inicio;
} Lista;
void inicializacion (Lista * tas){
    tas->inicio = NULL;
}
void muestraLista (Lista * tas){
    Nodo *actual;

    actual = tas->inicio;
    if (actual==NULL) return;
    while(1)
    {
        cout<< actual->dato <<endl;
        if (!actual->siguiente) break;
        actual = actual->siguiente;
    }
}
int  agregarAlFinal(Lista *tas,int dato){
    Nodo *nuevo_elemento;
    Nodo *actual;

    nuevo_elemento = (Nodo *) malloc (sizeof (Nodo));

    nuevo_elemento->dato= dato;
    nuevo_elemento->siguiente =NULL;


   if(tas->inicio==NULL)
   {
     tas->inicio=nuevo_elemento;
     nuevo_elemento->anterior=NULL;
   }
   else
   {
       actual=tas->inicio;
       while(1)
       {
           if(actual->siguiente==NULL)
           {
               break;
           }
            actual=actual->siguiente;
       }
          actual->siguiente=nuevo_elemento;
          nuevo_elemento->anterior=actual;
   }
}
void Funcion1(Lista *tas,int n)
{
    Nodo *actual;
    int i=0;
    actual=tas->inicio;
     while(1)
    {
        if(n-1==i)
        {
            cout<<(actual->dato)<<endl;
            break;
        }
        if(actual->siguiente==NULL && n>i)
        {
            cout<<"La Lista No posee esa cantidad de Nodos"<<endl;
            break;
        }
        actual=actual->siguiente;
        i++;
    }
}
void Funcion2(Lista *tas)
{
    Nodo *actual;
    Nodo *actual2;
    int aux;
    actual=tas->inicio;
    actual2=tas->inicio;
    int i=0;
    while(1)
    {
        if(actual2->siguiente==NULL)
        {
            break;
        }
        i++;
        actual2=actual2->siguiente;
    }
    while(actual!=actual2)
    {
        aux=actual->dato;
        actual->dato=actual2->dato;
        actual2->dato=aux;

         actual=actual->siguiente;
         actual2=actual2->anterior;
    }
    return;

}
void Funcion3(Lista *tas)
{
    Nodo *actual;
    Nodo *actual2;
    actual=tas->inicio;
    actual2=tas->inicio;
    actual2=actual2->siguiente;
    while(1)
    {
        if(actual2 < actual)
        {

            actual2=actual;
        }
        if(actual->siguiente==NULL)
        {
            break;
        }
    }
    if(actual2->siguiente==NULL)
    {
        actual2->anterior->siguiente=NULL;
    }
    if(actual2->siguiente!=NULL && actual2->anterior!=NULL)
    {
        actual2->anterior->siguiente=actual2->siguiente;
        actual2->siguiente->anterior=actual2->anterior;
    }
    if(actual2->anterior==NULL)
    {
        return;
    }
    actual=tas->inicio;
     actual2->siguiente = actual;
    tas->inicio =actual2;
    actual2->anterior=NULL;


}
int main()
{
    Lista *tas;
    int nom;
    int op,n;
    while(1)
    {
         cout<<"MENU........................"<<endl;
        cout<<"0-Mostrar Lista"<<endl;
        cout<<"1-Agregar Nodo"<<endl;
        cout<<"2-Funcion buscar"<<endl;
        cout<<"3-Funcion invertir"<<endl;
        cout<<"4-Funcion menor"<<endl;
        cout<<"5-Funcion mayor"<<endl;
        cout<<"6-Funcion borrar repetido"<<endl;
        cout<<"7-Salir"<<endl;
        cout<<endl;
        cout<<"Elegir opcion: ";
        cin>>op;
        cout<<"----------------------------------------------"<<endl;
        switch(op)
        {
            case 0:
            muestraLista(tas);
            break;
            case 1:
            cout<<"Ingrese un dato: ";
            cin>>nom;
            agregarAlFinal(tas,nom);
            cout<<"------------------------"<<endl;
            muestraLista(tas);
            cout<<"------------------------"<<endl;
            break;
            case 2:
            cout<<"Ingrese el Numero de Nodo que busca: ";
            cin>>n;
            cout<<"Resultado de operacion: ";
            Funcion1(tas,n);
            cout<<"------------------------"<<endl;
            muestraLista(tas);
            cout<<"------------------------"<<endl;
            break;
            case 3:
            Funcion2(tas);
            cout<<"------------------------"<<endl;
            muestraLista(tas);
            cout<<"------------------------"<<endl;
            break;
            case 4:
            Funcion3(tas);
            cout<<"------------------------"<<endl;
            muestraLista(tas);
            cout<<"------------------------"<<endl;
            break;




        }
    }
}
